package xauth

import (
	"time"

	"gitee.com/xiaoyutab/xgotool/optional/xcache"
	"gitee.com/xiaoyutab/xgotool/xerror"
)

// 创建/修改用户关联
//
//	fid	上级用户ID 0-删除此条目记录 1-忽略此条目（超管用户拥有所有用户ID） 其余值则表示判断是否存在上级，如果存在就修改，不存在就替换
//	uid	子用户ID 1-超管用户，此用户不可设置上下级关系，一旦传入此ID则直接返回nil
//	typ	关联权限来源
func CreateUserChild(fid, uid, typ uint) error {
	if fid == 0 || uid == 0 {
		errFun("用户ID不能为空", nil)
		return xerror.New("用户ID不能为空")
	}
	if typ == 0 {
		typ = 1
	}
	if uid == 1 || fid == 1 {
		return nil
	}
	if _default.DB == nil {
		errFun("数据库未连接", nil)
		return xerror.New("数据库未连接")
	}
	// 获取用户上级ID
	sup_id := GetUserParent(uid, typ)
	if fid == 0 {
		// 如果上级ID为0，则表示要删除该条目信息
		err := _default.DB.Table(_default.UserChildName).Where("user_id", uid).Delete(&UserChild{}).Error
		if err != nil {
			errFun("用户角色权限删除失败", err)
			return err
		}
		xcache.SetStruct(xcache.Key("xauth.GetUserParent", uid, typ), 0)
		xcache.Remove(xcache.Key("xauth.get-user-child-by-sup-id", sup_id, typ, nil))
		return nil
	}
	if sup_id > 0 {
		// 如果存在上级，则此需求就调整为编辑上级用户ID
		err := _default.DB.Table(_default.UserChildName).Where("user_id", uid).Update("superior_id", fid).Error
		if err != nil {
			errFun("用户角色权限插入失败", err)
			return err
		}
		xcache.SetStruct(xcache.Key("xauth.GetUserParent", uid, typ), fid)
		xcache.Remove(xcache.Key("xauth.get-user-child-by-sup-id", fid, typ, nil))
		return nil
	}
	err := _default.DB.Table(_default.UserChildName).Create(&UserChild{
		SuperiorId: fid,
		UserId:     uid,
		Type:       typ,
		CreatedAt:  time.Now().Format(time.DateTime),
	}).Error
	if err != nil {
		errFun("用户角色权限插入失败", err)
		return err
	}
	xcache.SetStruct(xcache.Key("xauth.GetUserParent", uid, typ), fid)
	xcache.Remove(xcache.Key("xauth.get-user-child-by-sup-id", fid, typ, nil))
	// 添加对应缓存操作
	return nil
}
